package JDBC;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class JavaSrverConnectTest {

    /*
    	由于`JSON`格式数据表示能力更强，所以现将服务器文件列表更改为`info.json`文件
    	并在里面添加了**服务器管理员的邮箱**信息及**同步文件列表**信息。
    	现需要将程序升级为读取`JSON`文件中的服务器列表来检测服务器状态，
    	并在控制台显示检测结果。若服务器状态异常请在控制台输出异常服务器信息。
    	若服务器状态正常，请将需要同步的数据文件通过**多个线程**发送到每台服务器上。
     */

    //并在控制台显示检测结果。若服务器状态异常请在控制台输出异常服务器信息，若服务器状态正常，请将需要同步的数据文件通过**多个线程**发送到每台服务器上。
    public static void main(String[] args) throws IOException {
        JSONParser parser = new JSONParser();
        try {
// 读取info.json文件
            FileReader reader = new FileReader("info.json");
// 解析JSON数据
            JSONObject jsonObject = (JSONObject) parser.parse(reader);
// 获取服务器列表信息
            JSONArray serverList = (JSONArray) jsonObject.get("server_list");
// 遍历服务器列表，检测服务器状态
            for (Object obj : serverList) {
                JSONObject serverInfo = (JSONObject) obj;
                String serverIp = (String) serverInfo.get("ip");
                int serverPort = Integer.parseInt((String) serverInfo.get("port"));
// 检测服务器状态
                boolean isServerUp = checkServerStatus(serverIp, serverPort);
                if (isServerUp) {
// 如果服务器状态正常，发送需要同步的数据文件到该服务器上
                    sendDataToServer(serverIp, serverPort);
                } else {
// 如果服务器状态异常，输出异常服务器信息
                    System.out.println("Server " + serverIp + ":" + serverPort + " is down!");
                }
            }
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }

    private static boolean checkServerStatus(String ip, int port) {
        // TODO: 实现检测服务器状态的逻辑，返回true表示服务器状态正常，返回false表示服务器状态异常
        return true;
    }

    private static void sendDataToServer(String ip, int port) {
        // TODO: 实现将需要同步的数据文件发送到指定服务器上的逻辑
    }
    }





    class Maps {
    public Map<Integer,String> in (){
        Map<Integer, String> ins = new HashMap<>();
        ins.put(100, "Continue：继续。客户端应继续其请求。");
        ins.put(101, "Switching Protocols: 切换协议。服务器已根据客户端的请求切换协议。");
        ins.put(200, "OK：请求成功。");
        ins.put(201, "Created：已创建。成功请求并创建了新的资源。");
        ins.put(202, "Accepted：已接受。已经接受请求，但未处理完成。");
        ins.put(203, "Non-Authoritative Information：非权威性信息。服务器成功处理了请求，但返回的信息可能来自另一来源。");
        ins.put(204, "No Content：无内容。服务器成功处理了请求，但没有返回任何内容。");
        ins.put(205, "Reset Content：重置内容。服务器成功处理了请求，但要求客户端重置视图。");
        ins.put(206, "Partial Content：部分内容。服务器成功处理了部分GET请求。");
        ins.put(300, "Multiple Choices：多种选择。请求的资源可包括多个位置，相应的实体可根据请求者在请求中提供的URI以任意一种方式移动。");
        ins.put(301, "Moved Permanently：永久移动。请求的资源已永久移动到新位置。");
        ins.put(302, "Found：临时移动。请求的资源已临时移动到新位置。");
        ins.put(303, "See Other：查看其它地址。由于请求对应的资源存在着另一个URL，客户端应使用GET方法去取得资源。");
        ins.put(304, "Not Modified：未修改。资源未被修改，可以使用缓存的版本。");
        ins.put(307, "Temporary Redirect：临时重定向。与302类似。使用GET请求重定向。");
        ins.put(400, "Bad Request：请求错误。请求中有语法问题。");
        ins.put(401, "Unauthorized：未授权。请求需要身份验证。");
        ins.put(402, "Payment Required：付款要求。保留，将来使用。");
        ins.put(403, "Forbidden：禁止访问。请求被拒绝。");
        ins.put(404, "Not Found：未找到。无法找到请求的资源。");
        ins.put(405, "Method Not Allowed：不允许的方法。请求中指定的方法不被允许。");
        ins.put(406, "Not Acceptable：不可接受。请求的资源的内容特性无法满足请求头中的条件。");
        ins.put(407, "Proxy Authentication Required：需要代理授权。");
        ins.put(408, "Request Timeout：请求超时。服务器等候请求时发生超时。");
        ins.put(409, "Conflict：冲突。由于请求的资源与资源的当前状态发生冲突，请求无法完成。");
        ins.put(410, "Gone：已删除。请求的资源已被永久删除。");
        ins.put(411, "Length Required：需要长度。服务器不接受不含有效内容长度标头字段的请求。");
        ins.put(412, "Precondition Failed：前提条件失败。服务端判断请求头字段中指定的某些前提条件失败。");
        ins.put(413, "Payload Too Large：请求实体过大。服务器无法处理请求，因为请求实体过大。");
        ins.put(414, "URI Too Long：URI过长。请求的URI长度超过了服务器能够解释的长度。");
        ins.put(415, "Unsupported Media Type：不支持的媒体类型。请求的格式不受请求页面的支持。");
        ins.put(416, "Range Not Satisfiable：范围不符合要求。如果请求中包含了Range请求头，并且服务器无法响应该请求，则会返回此状态码。");
        ins.put(417, "Expectation Failed：请求头Expect中指定的预期内容无法被服务器满足。");
        ins.put(418, "I'm a teapot。。");
        ins.put(422, "Unprocessable Entity：不可处理的实体。请求格式正确，但是由于含有语义错误，无法响应。");
        ins.put(423, "Locked：已锁定。当前资源被锁定。");
        ins.put(424, "Failed Dependency：请求失败。由于之前的请求发生错误，导致当前请求失败。");
        ins.put(426, "Upgrade Required：需要升级。客户端需要切换到TLS/1.0。");
        ins.put(428, "Precondition Required：要求先决条件。服务器要求先决条件，且请求无包含该先决条件。");
        ins.put(429, "Too Many Requests：请求过多。客户端的请求次数超过限额。");
        ins.put(431, "Request Header Fields Too Large：请求头字段过大。请求头超过了服务器的限制，服务器无法处理。");
        ins.put(451, "Unavailable For Legal Reasons：因法律原因不可用。用户请求的资源因法律问题已被删除。");
        ins.put(500, "Internal Server Error：服务器内部错误。服务器遇到了意料不到的情况，无法完成请求。");
        ins.put(501, "Not Implemented：尚未实施。服务器不支持请求的功能。");
        ins.put(502, " Bad Gateway：错误网关。服务器充当网关或代理时，从上游服务器接收到的响应是无效的。");
        ins.put(503, "Service Unavailable：服务不可用。服务器暂时不可用，通常是由于过多的请求或维护导致的。");
        ins.put(504, "Gateway Timeout：网关超时。服务器充当网关或代理时，无法及时从上游服务器收到响应。");
        ins.put(505, "HTTP Version Not Supported：HTTP版本不受支持。服务器不支持请求中所使用的HTTP协议版本。");
        ins.put(506, "Variant Also Negotiates：变量也协商。服务器有一个内部配置错误：某个变量资源被发现并不与其他所有变量资源一起工作。");
        ins.put(507, "Insufficient Storage：存储空间不足。服务器无法存储完成请求所必须的内容。");
        ins.put(508, "Loop Detected：检测到循环。服务器在处理请求时检测到无限循环。");
        ins.put(510, "Not Extended：未扩展。获取资源所需要的策略并没有被满足。");
        ins.put(511, "Network Authentication Required：需要网络授权。客户端需要进行身份验证，才能获得网络访问权限。");
        return ins;
    }
}